from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from django_redis import get_redis_connection
from goods.models import SKU
from .serialziers import CartSKUSerializer,PlaceOrderSerialzier,OrderCommitSerializer
from rest_framework.response import Response
from rest_framework.generics import CreateAPIView

# Create your views here.

class PlaceOrderView(APIView):

    """
    GET     orders/placeorders/

    1. 订单页面必须是登录用户才可以访问的
    # 2. 订单页面的展示商品数据 只能是 redis中 选中的商品的信息
    # 3. 我们需要根据id,查询商品的详细信息,这些信息是 模型
    # 4. 我们需要将模型转换为JSON
    """

    permission_classes = [IsAuthenticated]


    def get(self,request):

        # 0 已经做了权限的验证
        user = request.user

        # 1. 订单页面的展示商品数据 只能是 redis中 选中的商品的信息
        # 1.1 连接redis
        redis_conn = get_redis_connection('cart')
        # 1.2 获取redis的数据
        # cart = {sku_id:count}
        redis_cart = redis_conn.hgetall('cart_%s'%user.id)
        # redis_cart 包含了 选中和未选中的商品信息

        # [id,id]
        redis_selected_ids = redis_conn.smembers('cart_selected_%s'%user.id)

        # 1.3 组织 选中的商品的信息
        # cart = {sku_id:count}
        # cart = {1:4,3:5}
        cart = {}
        # redis_selected_ids 是选中的商品列表,我们对它进行遍历
        for sku_id in redis_selected_ids:
            cart[int(sku_id)]=redis_cart[sku_id]

        # 2. 我们需要根据id,查询商品的详细信息,这些信息是 模型
        ids = cart.keys()
        skus = SKU.objects.filter(pk__in=ids)
        # skus = [SKU,SKU,SKU]
        # 因为SKU中没有 用户选中商品个数的信息,我们可以动态的给它添加
        for sku in skus:
            sku.count = cart[sku.id]

        from decimal import Decimal
        freight = Decimal('10.00')

        # {
        #     'freight':
        #         'skus':[]
        # }

        serializer = PlaceOrderSerialzier(
            {'freight':freight,
             'skus':skus}
        )
        return Response(serializer.data)

        # 3. 我们需要将模型转换为JSON
        # serialzier = CartSKUSerializer(skus,many=True)
        # return Response(serialzier.data)


class OrderView(CreateAPIView):
    '''
    1.必须登录用户才可以访问，通过请求头传递的jwt_token
    2.对数据效验(省略)
    3.数据入库
    '''
    permission_classes = [IsAuthenticated]
    serializer_class = OrderCommitSerializer